package com.huawei.zyb.taskManager.domain.task.repository;

import com.huawei.zyb.taskManager.domain.task.entity.Task;
import com.huawei.zyb.taskManager.domain.task.valueobject.*;
import com.huawei.zyb.taskManager.domain.project.valueobject.ProjectId;
import com.huawei.zyb.taskManager.domain.requirement.valueobject.RequirementId;
import com.huawei.zyb.taskManager.domain.developer.valueobject.DeveloperId;
import java.util.List;
import java.util.Optional;

/**
 * 任务仓储接口
 * 定义任务聚合的持久化契约
 */
public interface TaskRepository {
    
    /**
     * 保存任务
     */
    Task save(Task task);
    
    /**
     * 根据ID查找任务
     */
    Optional<Task> findById(TaskId taskId);
    
    /**
     * 根据需求ID查找任务列表
     */
    List<Task> findByRequirementId(Long requirementId);
    
    /**
     * 根据指派人ID查找任务列表
     */
    List<Task> findByAssigneeId(String assigneeId);
    
    /**
     * 根据父任务ID查找子任务列表
     */
    List<Task> findByParentTaskId(TaskId parentTaskId);
    
    /**
     * 根据状态查找任务列表
     */
    List<Task> findByStatus(TaskStatus status);
    
    /**
     * 查找所有任务
     */
    List<Task> findAll();
    
    /**
     * 根据ID删除任务
     */
    void deleteById(TaskId taskId);
    
    /**
     * 检查任务是否存在
     */
    boolean existsById(TaskId taskId);
    
    /**
     * 检查父任务下是否还有未完成的子任务
     */
    boolean hasIncompleteSubTasks(TaskId parentTaskId);
    
    /**
     * 获取任务的所有子任务（递归）
     */
    List<Task> findAllSubTasksRecursively(TaskId parentTaskId);
    
    /**
     * 根据层级查找任务列表
     */
    List<Task> findByLevel(TaskLevel level);
    
    /**
     * 统计总任务数
     */
    long count();
    
    /**
     * 根据状态统计任务数
     */
    long countByStatus(TaskStatus status);
    
    /**
     * 根据优先级统计任务数
     */
    long countByPriority(TaskPriority priority);
}